//////////////////////////////////////////////////////////////////////////

#ifndef _SERVERCONNECTION_H_
#include "serverconnection.h"
#endif

//////////////////////////////////////////////////////////////////////////

#ifndef _ACCEPTOR_H_
#include "acceptor.h"
#endif

#include <iostream>

//////////////////////////////////////////////////////////////////////////


ServerConnection::ServerConnection( int _ID, const AcceptorPtr& _acceptor )
: Connection( static_cast<Acceptor*>( _acceptor.get() )->GetTCPSocket() ),
  m_ID(_ID),
  m_UDPServer( static_cast<Acceptor*>( _acceptor.get() )->GetUDPServer() ),
  m_CanUseUDP(false)
{
    boost::asio::ip::tcp::no_delay option(true);
    m_TCPSocket->set_option(option);
    m_UDPServer.AddConnection(*this);
    StartReceiveTCP();
}


//////////////////////////////////////////////////////////////////////////


ServerConnection::~ServerConnection()
{
    m_UDPServer.RemoveConnection(*this);
}


//////////////////////////////////////////////////////////////////////////


int ServerConnection::GetID() const
{
    return m_ID;
}


//////////////////////////////////////////////////////////////////////////


void ServerConnection::HandleRecvUDP( const char* _data, size_t _dataSize )
{
    m_UDPRecvPacket = NetworkPacket(_data, _dataSize);
    NotifyObservers(Observer::NETWORK_RECEIVE_COMPLETE_UDP);
}


//////////////////////////////////////////////////////////////////////////


void ServerConnection::SetUDPEndpoint( boost::asio::ip::udp::endpoint& _endpoint )
{
    // If endpoint is not set yet
    if ( !m_CanUseUDP )
    {
        // Set it
        m_Endpoint = _endpoint;
        m_CanUseUDP = true;
    }
    else
        // Endpoint can not change!
        assert(m_Endpoint == _endpoint);
}


//////////////////////////////////////////////////////////////////////////


void ServerConnection::SendUDP( const NetworkPacket& _data )
{
    if (m_CanUseUDP)
        m_UDPServer.SendUDP(_data, m_Endpoint);
}


//////////////////////////////////////////////////////////////////////////
